/**
  ******************************************************************************
  * @author     Chris
  * @since      2024/7/12 22:23
  *
  * @file       hd_oled_font.c
  * @brief      Xxx hardware driver.
  *
  * @note       This file contains the hardware driver for the Xxx.
  *
  * @warning    None.
  ******************************************************************************
  * Change Logs:
  *   Date          Author       Notes
  *   2024/7/12     Chris        the first version
  *
  ******************************************************************************
  */


#include <stdlib.h>
#include <string.h>
#include "hd_oled_font.h"

static uint8_t OLEDFont_getCharDotMatrix(uint8_t *dotMatrix, uint8_t fontSize, const uint8_t *font);

/**
 * UTF-8 encoder convert to Unicode charset
 *
 *
 * /------------------------------------------------------------------------------------------\
 * |         Unicode              |                          UTF-8                            |
 * |------------------------------| ----------|-----------|-----------|-----------|-----------|
 * | rank range            | bits | 1st byte  | 2nd byte  | 3rd byte  | 4th byte  | 5th byte  |
 * |-----------------------|------|-----------|-----------|-----------|-----------|-----------|
 * | 0000 0000 - 0000 007F |   7  | 0xxx xxxx |           |           |           |           |
 * | 0000 0080 - 0000 07FF |  11  | 110x xxxx | 10xx xxxx |           |           |           |
 * | 0000 0800 - 0000 FFFF |  16  | 1110 xxxx | 10xx xxxx | 10xx xxxx |           |           |
 * | 0001 0000 - 0010 FFFF |  21  | 1111 0xxx | 10xx xxxx | 10xx xxxx | 10xx xxxx |           |
 * | 0020 0000 - 03FF FFFF |  26  | 1111 10xx | 10xx xxxx | 10xx xxxx | 10xx xxxx | 10xx xxxx |
 * -------------------------------------------------------------------------------------------/
 *
 * @param unicode result of converting from utf8
 * @param utf8    the font array encoder by utf8
 * @return        the font array length
 */
static uint8_t utf8ToUnicode(uint8_t *unicode, const uint8_t *utf8) {
    if ((*utf8 >> 7) == 0) {
        // 1 byte utf8, 7 bits, ASCII
        *(unicode + 0) = *utf8;
        return 1;
    } else if ((*utf8 >> 5) == 0x6) {
        // 2 bytes utf8, 11 bits unicode
        *(unicode + 0) = ((*(utf8 + 0) & 0x1F) >> 2);                               // 3 bits
        *(unicode + 1) = ((*(utf8 + 0) & 0x03) << 6) | ((*(utf8 + 1) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 2;
    } else if ((*utf8 >> 4) == 0xE) {
        // 3 bytes utf8, 16 bits unicode,
        *(unicode + 0) = ((*(utf8 + 0) & 0x0F) << 4) | ((*(utf8 + 1) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 1) = ((*(utf8 + 1) & 0x03) << 6) | ((*(utf8 + 2) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 3;
    } else if ((*utf8 >> 3) == 0x1E) {
        // 4 bytes utf8, 21 bits unicode,
        *(unicode + 0) = ((*(utf8 + 0) & 0x07) << 2) | ((*(utf8 + 1) >> 4) & 0x03); // 5 bits = 3 + 2
        *(unicode + 1) = ((*(utf8 + 1) & 0x0F) << 4) | ((*(utf8 + 2) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 2) = ((*(utf8 + 2) & 0x03) << 6) | ((*(utf8 + 3) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 4;
    } else if ((*utf8 >> 2) == 0x3E) {
        // 5 bytes utf8, 26 bits unicode,
        *(unicode + 0) = *utf8 & 0x03;                                              // 2 bits
        *(unicode + 1) = ((*(utf8 + 1) & 0x3F) << 2) | ((*(utf8 + 2) >> 4) & 0x03); // 8 bits = 6 + 2
        *(unicode + 2) = ((*(utf8 + 2) & 0x0F) << 4) | ((*(utf8 + 3) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 3) = ((*(utf8 + 3) & 0x03) << 6) | ((*(utf8 + 4) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 5;
    } else {
        return 0;
    }
}

static uint32_t getAsciiAddress(uint8_t fontSize, const uint8_t *unicodeArr) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. ASCII: 0x00~0x7F; CN_ZH:0x4E00~0x9FA5
    uint32_t offset = unicodeArr[0];
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize / 2;

    switch (fontSize) {
        case 12:
            addr = STORAGE_ASCII_12X6_ADDRESS;
            break;
        case 16:
            addr = STORAGE_ASCII_16X8_ADDRESS;
            break;
        case 24:
            addr = STORAGE_ASCII_24X12_ADDRESS;
            break;
        default:
            addr = 0;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint32_t getUnicodeAddress(uint8_t fontSize, const uint8_t *unicodeArr) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. ASCII: 0x00~0x7F; CN_ZH:0x4E00~0x9FA5
    uint32_t offset = ((unicodeArr[0] << 8) + unicodeArr[1] - 0x4E00);
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    switch (fontSize) {
        case 12:
            addr = STORAGE_UNICODE_CN_ZH_12X12_ADDRESS;
            break;
        case 16:
            addr = STORAGE_UNICODE_CN_ZH_16X16_ADDRESS;
            break;
        case 24:
            addr = STORAGE_UNICODE_CN_ZH_24X24_ADDRESS;
            break;
        default:
            addr = 0;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint32_t getGBKAddress(uint8_t fontSize, const uint8_t *fontCN) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. GBK(0x8140 ~ 0xFEFE) has 126 region, and 12*16-2=190 code position at per region.
    uint32_t offset = ((fontCN[0] - 0x81) * 190 + (fontCN[1] - 0x40 - (fontCN[1] > 0x7F ? 1 : 0)));
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    switch (fontSize) {
        case 12:
            addr = STORAGE_GBK_12X12_ADDRESS;
            break;
        case 16:
            addr = STORAGE_GBK_16X16_ADDRESS;
            break;
        case 24:
            addr = STORAGE_GBK_24X24_ADDRESS;
            break;
        default:
            addr = STORAGE_GBK_12X12_ADDRESS;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint32_t getGB2312Address(uint8_t fontSize, const uint8_t *fontCN) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. GB2312 has 94 region, and 94 code position at per region.
    // chinese of GB2312 at 0xB0A1 ~ 0xF7FF.
    uint32_t offset = ((fontCN[0] - 0xA1) * 94 + (fontCN[1] - 0xA1));
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    switch (fontSize) {
        case 12:
            addr = STORAGE_GB2312_12X12_ADDRESS;
            break;
        case 16:
            addr = STORAGE_GB2312_16X16_ADDRESS;
            break;
        case 24:
            addr = STORAGE_GB2312_24X24_ADDRESS;
            break;
        default:
            addr = STORAGE_GB2312_12X12_ADDRESS;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

/**
 * Get the font dot matrix
 *
 * @param dotMatrix dot matrix array
 * @param font      font of ASCII, UTF-8, GBK
 * @param fontSize  font size, 12, 16, 24
 * @return          Number of bytes that make up this character. 1 for ASCII, 2 for GBK, 3 for UTF-8, etc.
 */
static uint8_t OLEDFont_getFontDotMatrix(OLEDFont *this, uint8_t *dotMatrix, uint8_t *font, uint8_t fontSize) {
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    if ((*font >> 7) == 0) {
        if (OLEDFont_getCharDotMatrix(dotMatrix, fontSize, font) == 0) {
            uint32_t storageAddress = getAsciiAddress(fontSize, font);  // the font location
            this->storage->read(this->storage, dotMatrix, storageAddress, fontByteSize / 2);
        }
        return 1;
    }

    // The font that encode by utf8 should convert to unicode, GBK can read directly.
    if (this->encoding == ENCODING_UTF8) {
        uint8_t unicodeArray[5] = {0};  // the array that storage the data after converting from utf8 to unicode
        uint8_t fontBytes;              // the count that the font encode by utf8
        uint32_t storageAddress;        // the font location

        fontBytes = utf8ToUnicode(unicodeArray, font);
        storageAddress = getUnicodeAddress(fontSize, unicodeArray);
        this->storage->read(this->storage, dotMatrix, storageAddress, fontByteSize);
        return fontBytes;
    } else if (this->encoding == ENCODING_GBK) {
        uint32_t storageAddr = getGBKAddress(fontSize, font);
        this->storage->read(this->storage, dotMatrix, storageAddr, fontByteSize);
        return 2;
    } else if (this->encoding == ENCODING_GB2312) {
        uint32_t storageAddr = getGB2312Address(fontSize, font);
        this->storage->read(this->storage, dotMatrix, storageAddr, fontByteSize);
        return 2;
    } else {
        return 0;
    }
}

static OLEDFont *build(Storage *storage, uint8_t encoding) {
    OLEDFont *of = malloc(sizeof(OLEDFont));

    Driver_add(of, GEN_PERM);

    of->storage          = storage;
    of->encoding         = encoding;
    of->getFontDotMatrix = &OLEDFont_getFontDotMatrix;

    return of;
}

const struct OLEDFontClass OLEDFontBuilder = {.build = &build};


/** region Image test: eve serious of WALL-E */
const uint8_t eveSerious[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00,
        0x00, 0x00,
        0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0xE0,
        0xFF, 0xFF,
        0x00, 0x00, 0xF0, 0xFF, 0x7F, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, 0x00,
        0xFF, 0xFF,
        0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0x3F, 0xFC, 0xF7,
        0xFF, 0xFF,
        0x00, 0xF0, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFC,
        0xFF, 0x00,
        0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE,
        0xFF, 0xFF,
        0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xC0, 0xFF,
        0x4F, 0x00,
        0x00, 0xFC, 0xFF, 0xFF, 0xE0, 0xFF, 0x67, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0x33, 0xF8, 0x01, 0xF8,
        0xFF, 0xFF,
        0xF0, 0xFF, 0x13, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0x19, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF,
        0x09, 0xF8,
        0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0,
        0xFF, 0xFF,
        0xF8, 0xFF, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
        0x00, 0xE0,
        0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0,
        0xFF, 0xFF,
        0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
        0x00, 0x00,
        0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0,
        0xFF, 0xFF,
        0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
        0x00, 0xE0,
        0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0x7F, 0x00, 0xF0, 0x07, 0xF0,
        0xFF, 0xFF,
        0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF,
        0x00, 0xF8,
        0x07, 0xF0, 0xFF, 0xFF, 0xF0, 0xFF, 0x01, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0x01, 0xF8, 0x03, 0xF8,
        0xFF, 0xFF,
        0xE0, 0xFF, 0x03, 0xF8, 0x01, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0x03, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xC0, 0xFF,
        0x07, 0x00,
        0x00, 0xFC, 0xFF, 0xFF, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0xFE,
        0xFF, 0xFF,
        0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFC,
        0x7F, 0x00,
        0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x03, 0xC0, 0xFF,
        0xFF, 0xFF,
        0x00, 0xE0, 0xFF, 0x0F, 0xF0, 0xF7, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x80,
        0xFF, 0xFF,
        0xFF, 0xE3, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xE1, 0xFF, 0xF8, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xE0,
        0x3F, 0xFF,
        0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xE0, 0x9F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0xC0, 0xDF, 0xFF, 0x00, 0x00,
        0x00, 0xF0,
        0x03, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF
};
/** endregion */

/** region Image test: eve smile of WALL-E */
const uint8_t eveSmile[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xF0,
        0x01, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0xF0,
        0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF,
        0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0,
        0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x00, 0xF8, 0xFF, 0xFF, 0xF3, 0x00, 0xFC, 0x3F, 0x00,
        0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xFE, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x0F, 0x00, 0xC0, 0xFF,
        0xFF, 0xFF, 0x80, 0xFF, 0x07, 0x30, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0x38, 0x80, 0xFF, 0xFF, 0xFF,
        0xC0, 0xFF, 0x01, 0x3C, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F,
        0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0x00, 0x1E,
        0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E, 0x00, 0xFF,
        0xFF, 0xFF, 0xFC, 0x1F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF,
        0xFC, 0x0F, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07,
        0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00,
        0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF,
        0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
        0xFC, 0x07, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F,
        0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E,
        0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x00, 0x0E, 0x00, 0xFF,
        0xFF, 0xFF, 0xF0, 0x3F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF,
        0xE0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF,
        0x01, 0x3C, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0x38, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x07, 0x20,
        0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0xFF,
        0xFF, 0xFF, 0x00, 0xFC, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0xF7,
        0x00, 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x80,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0xF8, 0xFF,
        0x7F, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0xF0,
        0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0

};
/** endregion */


// ASCII charset(32~125): !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

/** region 12*6 ASCII font library */
const unsigned char asc_1206[][12] = {
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*" ",0*/
        {0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"!",1*/
        {0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00},/*""",2*/
        {0x90, 0x00, 0xFC, 0x03, 0x90, 0x00, 0xFC, 0x03, 0x90, 0x00, 0x00, 0x00},/*"#",3*/
        {0x18, 0x01, 0x24, 0x02, 0xFE, 0x07, 0x44, 0x02, 0x88, 0x01, 0x00, 0x00},/*"$",4*/
        {0x38, 0x00, 0x44, 0x03, 0xF8, 0x00, 0xD0, 0x01, 0x2C, 0x02, 0xC0, 0x01},/*"%",5*/
        {0xC0, 0x01, 0x38, 0x02, 0xE4, 0x02, 0x18, 0x01, 0xE0, 0x02, 0x20, 0x01},/*"&",6*/
        {0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"'",7*/
        {0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x06, 0x03, 0x01, 0x04, 0x00, 0x00},/*"(",8*/
        {0x00, 0x00, 0x01, 0x04, 0x06, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00},/*")",9*/
        {0x90, 0x00, 0x60, 0x00, 0xF8, 0x01, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00},/*"*",10*/
        {0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x20, 0x00},/*"+",11*/
        {0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*",",12*/
        {0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00},/*"-",13*/
        {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*".",14*/
        {0x00, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x02, 0x00},/*"/",15*/
        {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00},/*"0",16*/
        {0x00, 0x00, 0x08, 0x02, 0xFC, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00},/*"1",17*/
        {0x18, 0x03, 0x84, 0x02, 0x44, 0x02, 0x24, 0x02, 0x18, 0x02, 0x00, 0x00},/*"2",18*/
        {0x08, 0x01, 0x04, 0x02, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00},/*"3",19*/
        {0xC0, 0x00, 0xA0, 0x00, 0x98, 0x02, 0xFC, 0x03, 0x80, 0x02, 0x00, 0x00},/*"4",20*/
        {0x7C, 0x01, 0x24, 0x02, 0x24, 0x02, 0x24, 0x02, 0xC4, 0x01, 0x00, 0x00},/*"5",21*/
        {0xF0, 0x01, 0x48, 0x02, 0x24, 0x02, 0x24, 0x02, 0xC8, 0x01, 0x00, 0x00},/*"6",22*/
        {0x00, 0x00, 0x04, 0x00, 0xC4, 0x03, 0x34, 0x00, 0x0C, 0x00, 0x00, 0x00},/*"7",23*/
        {0xD8, 0x01, 0x24, 0x02, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00},/*"8",24*/
        {0x38, 0x01, 0x44, 0x02, 0x44, 0x02, 0x24, 0x01, 0xF8, 0x00, 0x00, 0x00},/*"9",25*/
        {0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*":",26*/
        {0x00, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*";",27*/
        {0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x04, 0x02, 0x00, 0x00},/*"<",28*/
        {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00},/*"=",29*/
        {0x00, 0x00, 0x04, 0x02, 0x08, 0x01, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00},/*">",30*/
        {0x18, 0x00, 0x04, 0x00, 0xC4, 0x02, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00},/*"?",31*/
        {0xF0, 0x00, 0x08, 0x01, 0xE4, 0x02, 0xF4, 0x02, 0x84, 0x02, 0x78, 0x01},/*"@",32*/
        {0x00, 0x02, 0xE0, 0x03, 0x9C, 0x00, 0xF0, 0x00, 0x80, 0x03, 0x00, 0x02},/*"A",33*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00},/*"B",34*/
        {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x0C, 0x01, 0x00, 0x00},/*"C",35*/
        {0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00},/*"D",36*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x74, 0x02, 0x0C, 0x03, 0x00, 0x00},/*"E",37*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x74, 0x00, 0x0C, 0x00, 0x00, 0x00},/*"F",38*/
        {0xF0, 0x00, 0x08, 0x01, 0x04, 0x02, 0x44, 0x02, 0xCC, 0x01, 0x40, 0x00},/*"G",39*/
        {0x04, 0x02, 0xFC, 0x03, 0x20, 0x00, 0x20, 0x00, 0xFC, 0x03, 0x04, 0x02},/*"H",40*/
        {0x04, 0x02, 0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x04, 0x02, 0x00, 0x00},/*"I",41*/
        {0x00, 0x0C, 0x04, 0x08, 0x04, 0x08, 0xFC, 0x07, 0x04, 0x00, 0x04, 0x00},/*"J",42*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x50, 0x00, 0x8C, 0x03, 0x04, 0x02},/*"K",43*/
        {0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03},/*"L",44*/
        {0xFC, 0x03, 0x3C, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0xFC, 0x03, 0x04, 0x02},/*"M",45*/
        {0x04, 0x02, 0xFC, 0x03, 0x30, 0x02, 0xC4, 0x00, 0xFC, 0x03, 0x04, 0x00},/*"N",46*/
        {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00},/*"O",47*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00},/*"P",48*/
        {0xF8, 0x01, 0x84, 0x02, 0x84, 0x02, 0x04, 0x07, 0xF8, 0x05, 0x00, 0x00},/*"Q",49*/
        {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x64, 0x00, 0x98, 0x03, 0x00, 0x02},/*"R",50*/
        {0x18, 0x03, 0x24, 0x02, 0x24, 0x02, 0x44, 0x02, 0x8C, 0x01, 0x00, 0x00},/*"S",51*/
        {0x0C, 0x00, 0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x0C, 0x00, 0x00, 0x00},/*"T",52*/
        {0x04, 0x00, 0xFC, 0x01, 0x00, 0x02, 0x00, 0x02, 0xFC, 0x01, 0x04, 0x00},/*"U",53*/
        {0x04, 0x00, 0x7C, 0x00, 0x80, 0x03, 0xE0, 0x00, 0x1C, 0x00, 0x04, 0x00},/*"V",54*/
        {0x3C, 0x00, 0xC0, 0x03, 0x7C, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0x00},/*"W",55*/
        {0x04, 0x02, 0x9C, 0x03, 0x60, 0x00, 0x9C, 0x03, 0x04, 0x02, 0x00, 0x00},/*"X",56*/
        {0x04, 0x00, 0x3C, 0x02, 0xC0, 0x03, 0x3C, 0x02, 0x04, 0x00, 0x00, 0x00},/*"Y",57*/
        {0x0C, 0x02, 0x84, 0x03, 0x64, 0x02, 0x1C, 0x02, 0x04, 0x03, 0x00, 0x00},/*"Z",58*/
        {0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x01, 0x04, 0x01, 0x04, 0x00, 0x00},/*"[",59*/
        {0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x00},/*"\",60*/
        {0x00, 0x00, 0x01, 0x04, 0x01, 0x04, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00},/*"]",61*/
        {0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00},/*"^",62*/
        {0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08},/*"_",63*/
        {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"`",64*/
        {0x00, 0x00, 0x40, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x03, 0x00, 0x02},/*"a",65*/
        {0x02, 0x00, 0xFE, 0x03, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00},/*"b",66*/
        {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0x60, 0x01, 0x00, 0x00},/*"c",67*/
        {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x22, 0x02, 0xFE, 0x03, 0x00, 0x02},/*"d",68*/
        {0x00, 0x00, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, 0x00, 0x00},/*"e",69*/
        {0x00, 0x00, 0x20, 0x02, 0xFC, 0x03, 0x22, 0x02, 0x22, 0x02, 0x04, 0x00},/*"f",70*/
        {0x00, 0x00, 0x40, 0x05, 0xA0, 0x0A, 0xA0, 0x0A, 0x60, 0x0A, 0x20, 0x04},/*"g",71*/
        {0x02, 0x02, 0xFE, 0x03, 0x20, 0x02, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x02},/*"h",72*/
        {0x00, 0x00, 0x20, 0x02, 0xE6, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00},/*"i",73*/
        {0x00, 0x08, 0x00, 0x08, 0x20, 0x08, 0xE6, 0x07, 0x00, 0x00, 0x00, 0x00},/*"j",74*/
        {0x02, 0x02, 0xFE, 0x03, 0x80, 0x00, 0x60, 0x01, 0x20, 0x02, 0x00, 0x00},/*"k",75*/
        {0x02, 0x02, 0x02, 0x02, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00},/*"l",76*/
        {0xE0, 0x03, 0x20, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x00},/*"m",77*/
        {0x20, 0x02, 0xE0, 0x03, 0x20, 0x02, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x02},/*"n",78*/
        {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00},/*"o",79*/
        {0x20, 0x08, 0xE0, 0x0F, 0x20, 0x0A, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00},/*"p",80*/
        {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x0A, 0xE0, 0x0F, 0x00, 0x08},/*"q",81*/
        {0x20, 0x02, 0xE0, 0x03, 0x40, 0x02, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00},/*"r",82*/
        {0x00, 0x00, 0x60, 0x02, 0xA0, 0x02, 0xA0, 0x02, 0x20, 0x03, 0x00, 0x00},/*"s",83*/
        {0x00, 0x00, 0x20, 0x00, 0xF8, 0x03, 0x20, 0x02, 0x20, 0x02, 0x00, 0x00},/*"t",84*/
        {0x20, 0x00, 0xE0, 0x01, 0x00, 0x02, 0x20, 0x02, 0xE0, 0x03, 0x00, 0x02},/*"u",85*/
        {0x20, 0x00, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x20, 0x00, 0x00, 0x00},/*"v",86*/
        {0x60, 0x00, 0x80, 0x03, 0xE0, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00},/*"w",87*/
        {0x20, 0x02, 0x60, 0x03, 0x80, 0x00, 0x60, 0x03, 0x20, 0x02, 0x00, 0x00},/*"x",88*/
        {0x20, 0x08, 0xE0, 0x08, 0x00, 0x05, 0x00, 0x03, 0xE0, 0x00, 0x20, 0x00},/*"y",89*/
        {0x00, 0x00, 0x20, 0x02, 0xA0, 0x03, 0x60, 0x02, 0x20, 0x02, 0x00, 0x00},/*"z",90*/
        {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFF, 0x07, 0x01, 0x04, 0x00, 0x00},/*"{",91*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00},/*"|",92*/
        {0x00, 0x00, 0x01, 0x04, 0xDF, 0x07, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},/*"}",93*/
        {0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00},/*"~",94*/
};
/** endregion */

/** region 16*8 ASCII font library */
const unsigned char asc_1608[][16] = {

        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*" ",0*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"!",1*/
        {0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00},/*""",2*/
        {0x00, 0x00, 0x40, 0x04, 0xC0, 0x3F, 0x78, 0x04, 0x40, 0x04, 0xC0, 0x3F, 0x78, 0x04, 0x00, 0x00},/*"#",3*/
        {0x00, 0x00, 0x70, 0x18, 0x88, 0x20, 0x88, 0x20, 0xFC, 0xFF, 0x08, 0x21, 0x30, 0x1E, 0x00, 0x00},/*"$",4*/
        {0xF0, 0x00, 0x08, 0x31, 0xF0, 0x0C, 0x80, 0x03, 0x60, 0x1E, 0x18, 0x21, 0x00, 0x1E, 0x00, 0x00},/*"%",5*/
        {0x00, 0x1E, 0xF0, 0x21, 0x08, 0x23, 0x88, 0x2C, 0x70, 0x19, 0x00, 0x27, 0x00, 0x21, 0x00, 0x10},/*"&",6*/
        {0x00, 0x00, 0x12, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"'",7*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x02, 0x40, 0x00, 0x00},/*"(",8*/
        {0x00, 0x00, 0x02, 0x40, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*")",9*/
        {0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00},/*"*",10*/
        {0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xE0, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01},/*"+",11*/
        {0x00, 0x00, 0x00, 0x90, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*",",12*/
        {0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00},/*"-",13*/
        {0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*".",14*/
        {0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x07, 0xC0, 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0x00},/*"/",15*/
        {0x00, 0x00, 0xE0, 0x0F, 0x10, 0x10, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00},/*"0",16*/
        {0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x10, 0x20, 0xF8, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00},/*"1",17*/
        {0x00, 0x00, 0x70, 0x30, 0x08, 0x28, 0x08, 0x24, 0x08, 0x22, 0x08, 0x21, 0xF0, 0x30, 0x00, 0x00},/*"2",18*/
        {0x00, 0x00, 0x30, 0x18, 0x08, 0x20, 0x08, 0x21, 0x08, 0x21, 0x88, 0x22, 0x70, 0x1C, 0x00, 0x00},/*"3",19*/
        {0x00, 0x00, 0x00, 0x06, 0x80, 0x05, 0x40, 0x24, 0x30, 0x24, 0xF8, 0x3F, 0x00, 0x24, 0x00, 0x24},/*"4",20*/
        {0x00, 0x00, 0xF8, 0x19, 0x88, 0x20, 0x88, 0x20, 0x88, 0x20, 0x08, 0x11, 0x08, 0x0E, 0x00, 0x00},/*"5",21*/
        {0x00, 0x00, 0xE0, 0x0F, 0x10, 0x11, 0x88, 0x20, 0x88, 0x20, 0x90, 0x20, 0x00, 0x1F, 0x00, 0x00},/*"6",22*/
        {0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x3E, 0x88, 0x01, 0x68, 0x00, 0x18, 0x00, 0x00, 0x00},/*"7",23*/
        {0x00, 0x00, 0x70, 0x1C, 0x88, 0x22, 0x08, 0x21, 0x08, 0x21, 0x88, 0x22, 0x70, 0x1C, 0x00, 0x00},/*"8",24*/
        {0x00, 0x00, 0xF0, 0x01, 0x08, 0x12, 0x08, 0x22, 0x08, 0x22, 0x10, 0x11, 0xE0, 0x0F, 0x00, 0x00},/*"9",25*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*":",26*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*";",27*/
        {0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x10, 0x10, 0x08, 0x20, 0x00, 0x00},/*"<",28*/
        {0x00, 0x00, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00},/*"=",29*/
        {0x00, 0x00, 0x08, 0x20, 0x10, 0x10, 0x20, 0x08, 0x40, 0x04, 0x80, 0x02, 0x00, 0x01, 0x00, 0x00},/*">",30*/
        {0x00, 0x00, 0x70, 0x00, 0x48, 0x00, 0x08, 0x30, 0x08, 0x37, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00},/*"?",31*/
        {0xC0, 0x07, 0x30, 0x18, 0xC8, 0x27, 0x28, 0x28, 0xE8, 0x2F, 0x10, 0x28, 0xE0, 0x17, 0x00, 0x00},/*"@",32*/
        {0x00, 0x20, 0x00, 0x3C, 0xC0, 0x23, 0x38, 0x02, 0xE0, 0x02, 0x00, 0x27, 0x00, 0x38, 0x00, 0x20},/*"A",33*/
        {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x20, 0x88, 0x20, 0x70, 0x11, 0x00, 0x0E, 0x00, 0x00},/*"B",34*/
        {0xC0, 0x07, 0x30, 0x18, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0x10, 0x38, 0x08, 0x00, 0x00},/*"C",35*/
        {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00},/*"D",36*/
        {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x20, 0xE8, 0x23, 0x08, 0x20, 0x10, 0x18, 0x00, 0x00},/*"E",37*/
        {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x00, 0xE8, 0x03, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00},/*"F",38*/
        {0xC0, 0x07, 0x30, 0x18, 0x08, 0x20, 0x08, 0x20, 0x08, 0x22, 0x38, 0x1E, 0x00, 0x02, 0x00, 0x00},/*"G",39*/
        {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x21, 0x00, 0x01, 0x00, 0x01, 0x08, 0x21, 0xF8, 0x3F, 0x08, 0x20},/*"H",40*/
        {0x00, 0x00, 0x08, 0x20, 0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00},/*"I",41*/
        {0x00, 0xC0, 0x00, 0x80, 0x08, 0x80, 0x08, 0x80, 0xF8, 0x7F, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00},/*"J",42*/
        {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0xC0, 0x01, 0x28, 0x26, 0x18, 0x38, 0x08, 0x20, 0x00, 0x00},/*"K",43*/
        {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00},/*"L",44*/
        {0x08, 0x20, 0xF8, 0x3F, 0xF8, 0x01, 0x00, 0x3E, 0xF8, 0x01, 0xF8, 0x3F, 0x08, 0x20, 0x00, 0x00},/*"M",45*/
        {0x08, 0x20, 0xF8, 0x3F, 0x30, 0x20, 0xC0, 0x00, 0x00, 0x07, 0x08, 0x18, 0xF8, 0x3F, 0x08, 0x00},/*"N",46*/
        {0xE0, 0x0F, 0x10, 0x10, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00},/*"O",47*/
        {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x21, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0xF0, 0x00, 0x00, 0x00},/*"P",48*/
        {0xE0, 0x0F, 0x10, 0x10, 0x08, 0x28, 0x08, 0x28, 0x08, 0x30, 0x10, 0x50, 0xE0, 0x4F, 0x00, 0x00},/*"Q",49*/
        {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x00, 0x88, 0x03, 0x88, 0x0C, 0x70, 0x30, 0x00, 0x20},/*"R",50*/
        {0x00, 0x00, 0x70, 0x38, 0x88, 0x20, 0x08, 0x21, 0x08, 0x21, 0x08, 0x22, 0x38, 0x1C, 0x00, 0x00},/*"S",51*/
        {0x18, 0x00, 0x08, 0x00, 0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00},/*"T",52*/
        {0x08, 0x00, 0xF8, 0x1F, 0x08, 0x20, 0x00, 0x20, 0x00, 0x20, 0x08, 0x20, 0xF8, 0x1F, 0x08, 0x00},/*"U",53*/
        {0x08, 0x00, 0x78, 0x00, 0x88, 0x07, 0x00, 0x38, 0x00, 0x0E, 0xC8, 0x01, 0x38, 0x00, 0x08, 0x00},/*"V",54*/
        {0x08, 0x00, 0xF8, 0x03, 0x00, 0x3E, 0xF8, 0x01, 0x00, 0x3E, 0xF8, 0x03, 0x08, 0x00, 0x00, 0x00},/*"W",55*/
        {0x08, 0x20, 0x18, 0x30, 0x68, 0x2C, 0x80, 0x03, 0x80, 0x03, 0x68, 0x2C, 0x18, 0x30, 0x08, 0x20},/*"X",56*/
        {0x08, 0x00, 0x38, 0x00, 0xC8, 0x20, 0x00, 0x3F, 0xC8, 0x20, 0x38, 0x00, 0x08, 0x00, 0x00, 0x00},/*"Y",57*/
        {0x10, 0x20, 0x08, 0x38, 0x08, 0x26, 0x08, 0x21, 0xC8, 0x20, 0x38, 0x20, 0x08, 0x18, 0x00, 0x00},/*"Z",58*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x00, 0x00},/*"[",59*/
        {0x00, 0x00, 0x04, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x00},/*"\",60*/
        {0x00, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"]",61*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00},/*"^",62*/
        {0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80},/*"_",63*/
        {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"`",64*/
        {0x00, 0x00, 0x00, 0x19, 0x80, 0x24, 0x80, 0x24, 0x80, 0x12, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x00},/*"a",65*/
        {0x10, 0x00, 0xF0, 0x3F, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00},/*"b",66*/
        {0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x00},/*"c",67*/
        {0x00, 0x00, 0x00, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x90, 0x10, 0xF0, 0x3F, 0x00, 0x20},/*"d",68*/
        {0x00, 0x00, 0x00, 0x1F, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x00, 0x17, 0x00, 0x00},/*"e",69*/
        {0x00, 0x00, 0x80, 0x20, 0x80, 0x20, 0xE0, 0x3F, 0x90, 0x20, 0x90, 0x20, 0x20, 0x00, 0x00, 0x00},/*"f",70*/
        {0x00, 0x00, 0x00, 0x6B, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x93, 0x80, 0x60, 0x00, 0x00},/*"g",71*/
        {0x10, 0x20, 0xF0, 0x3F, 0x00, 0x21, 0x80, 0x00, 0x80, 0x00, 0x80, 0x20, 0x00, 0x3F, 0x00, 0x20},/*"h",72*/
        {0x00, 0x00, 0x80, 0x20, 0x98, 0x20, 0x98, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00},/*"i",73*/
        {0x00, 0x00, 0x00, 0xC0, 0x00, 0x80, 0x80, 0x80, 0x98, 0x80, 0x98, 0x7F, 0x00, 0x00, 0x00, 0x00},/*"j",74*/
        {0x10, 0x20, 0xF0, 0x3F, 0x00, 0x24, 0x00, 0x06, 0x80, 0x29, 0x80, 0x30, 0x80, 0x20, 0x00, 0x00},/*"k",75*/
        {0x00, 0x00, 0x10, 0x20, 0x10, 0x20, 0xF8, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00},/*"l",76*/
        {0x80, 0x20, 0x80, 0x3F, 0x80, 0x20, 0x80, 0x00, 0x80, 0x3F, 0x80, 0x20, 0x80, 0x00, 0x00, 0x3F},/*"m",77*/
        {0x80, 0x20, 0x80, 0x3F, 0x00, 0x21, 0x80, 0x00, 0x80, 0x00, 0x80, 0x20, 0x00, 0x3F, 0x00, 0x20},/*"n",78*/
        {0x00, 0x00, 0x00, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x1F, 0x00, 0x00},/*"o",79*/
        {0x80, 0x80, 0x80, 0xFF, 0x00, 0x91, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00},/*"p",80*/
        {0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x00, 0x91, 0x80, 0xFF, 0x00, 0x80},/*"q",81*/
        {0x80, 0x20, 0x80, 0x20, 0x80, 0x3F, 0x00, 0x21, 0x80, 0x20, 0x80, 0x00, 0x80, 0x01, 0x00, 0x00},/*"r",82*/
        {0x00, 0x00, 0x00, 0x33, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x19, 0x00, 0x00},/*"s",83*/
        {0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xE0, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x00, 0x10, 0x00, 0x00},/*"t",84*/
        {0x80, 0x00, 0x80, 0x1F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x80, 0x10, 0x80, 0x3F, 0x00, 0x20},/*"u",85*/
        {0x80, 0x00, 0x80, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x80, 0x0C, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00},/*"v",86*/
        {0x80, 0x01, 0x80, 0x0E, 0x00, 0x30, 0x80, 0x0C, 0x80, 0x07, 0x00, 0x38, 0x80, 0x06, 0x80, 0x01},/*"w",87*/
        {0x00, 0x00, 0x80, 0x20, 0x80, 0x31, 0x80, 0x0E, 0x00, 0x2E, 0x80, 0x31, 0x80, 0x20, 0x00, 0x00},/*"x",88*/
        {0x80, 0x00, 0x80, 0x81, 0x80, 0x86, 0x00, 0x78, 0x00, 0x18, 0x80, 0x06, 0x80, 0x01, 0x80, 0x00},/*"y",89*/
        {0x00, 0x00, 0x80, 0x21, 0x80, 0x30, 0x80, 0x2C, 0x80, 0x22, 0x80, 0x21, 0x80, 0x30, 0x00, 0x00},/*"z",90*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x3E, 0x02, 0x40, 0x02, 0x40},/*"{",91*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"|",92*/
        {0x02, 0x40, 0x02, 0x40, 0xFC, 0x3E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"}",93*/
        {0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00},/*"~",94*/



};
/** endregion */

/** region 24*12 ASICII font library */
const unsigned char asc_2412[95][36] = {
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*" ",0*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x77, 0x1C, 0xF0, 0x0F, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"!",1*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00},/*""",2*/
        {0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x83, 0x1F, 0x00, 0xFF, 0x01, 0xF0, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0xFB, 0x1F, 0xF0, 0x87, 0x01, 0x00, 0x83, 0x01, 0x00, 0x00, 0x00},/*"#",3*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x07, 0xC0, 0x07, 0x0F, 0x60, 0x0C, 0x12, 0x20, 0x18, 0x10, 0xF8, 0xFF, 0x7F, 0x20, 0x71, 0x10, 0xE0, 0xE1, 0x0F, 0xC0, 0x81, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"$",4*/
        {0xC0, 0x07, 0x00, 0x30, 0x18, 0x00, 0x10, 0x10, 0x18, 0x30, 0x18, 0x07, 0xC0, 0xCF, 0x00, 0x00, 0x38, 0x00, 0x00, 0xC6, 0x07, 0xC0, 0x31, 0x18, 0x30, 0x10, 0x10, 0x00, 0x30, 0x18, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00},/*"%",5*/
        {0x00, 0xC0, 0x07, 0x00, 0xE0, 0x0F, 0xE0, 0x17, 0x18, 0xF0, 0x3F, 0x10, 0x10, 0xF8, 0x10, 0xF0, 0xC7, 0x13, 0xE0, 0x03, 0x0F, 0x00, 0x08, 0x0E, 0x00, 0xF8, 0x19, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x0C},/*"&",6*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"'",7*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x80, 0x01, 0x03, 0x60, 0x00, 0x0C, 0x10, 0x00, 0x10, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00},/*"(",8*/
        {0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x08, 0x00, 0x20, 0x10, 0x00, 0x10, 0x60, 0x00, 0x0C, 0x80, 0x01, 0x03, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*")",9*/
        {0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0xC0, 0xFF, 0x03, 0x80, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00},/*"*",10*/
        {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00},/*"+",11*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*",",12*/
        {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00},/*"-",13*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*".",14*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x01, 0x00, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00},/*"/",15*/
        {0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xC0, 0x01, 0x0E, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00},/*"0",16*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"1",17*/
        {0x00, 0x00, 0x00, 0x80, 0x03, 0x18, 0x40, 0x03, 0x1C, 0x20, 0x00, 0x12, 0x20, 0x00, 0x11, 0x20, 0xC0, 0x10, 0x20, 0x60, 0x10, 0x60, 0x30, 0x10, 0xC0, 0x1F, 0x10, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"2",18*/
        {0x00, 0x00, 0x00, 0xC0, 0x01, 0x0E, 0xC0, 0x01, 0x0E, 0x20, 0x00, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0x80, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"3",19*/
        {0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x84, 0x00, 0x00, 0x83, 0x10, 0x80, 0x80, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x00},/*"4",20*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x3F, 0x0B, 0x20, 0x10, 0x10, 0x20, 0x08, 0x10, 0x20, 0x08, 0x10, 0x20, 0x08, 0x10, 0x20, 0x18, 0x1C, 0x20, 0xF0, 0x0F, 0x20, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"5",21*/
        {0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x21, 0x0C, 0x40, 0x10, 0x18, 0x20, 0x08, 0x10, 0x20, 0x08, 0x10, 0x20, 0x08, 0x10, 0xE0, 0x18, 0x08, 0xC0, 0xF0, 0x0F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00},/*"6",22*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x20, 0xE0, 0x1F, 0x20, 0x18, 0x00, 0x20, 0x07, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00},/*"7",23*/
        {0x00, 0x00, 0x00, 0x80, 0x83, 0x07, 0xC0, 0xCF, 0x0F, 0x60, 0x6C, 0x08, 0x20, 0x18, 0x10, 0x20, 0x10, 0x10, 0x20, 0x30, 0x10, 0x20, 0x30, 0x10, 0x60, 0x68, 0x18, 0xC0, 0xCF, 0x0F, 0x80, 0x83, 0x07, 0x00, 0x00, 0x00},/*"8",24*/
        {0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0x3F, 0x0C, 0xC0, 0x60, 0x1C, 0x20, 0x40, 0x10, 0x20, 0x40, 0x10, 0x20, 0x40, 0x10, 0x20, 0x20, 0x08, 0xC0, 0x10, 0x0F, 0x80, 0xFF, 0x03, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00},/*"9",25*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*":",26*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, 0x00, 0x0C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*";",27*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x01, 0x80, 0x00, 0x02, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00},/*"<",28*/
        {0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00},/*"=",29*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x40, 0x00, 0x04, 0x80, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00},/*">",30*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x40, 0x06, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x20, 0xE0, 0x1C, 0x20, 0x10, 0x1C, 0x20, 0x18, 0x00, 0x60, 0x08, 0x00, 0xC0, 0x0F, 0x00, 0x80, 0x07, 0x00},/*"?",31*/
        {0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xC0, 0xFF, 0x07, 0xE0, 0x00, 0x0E, 0x20, 0xF8, 0x18, 0x10, 0xFF, 0x11, 0x90, 0x03, 0x11, 0x90, 0xFC, 0x11, 0xA0, 0x07, 0x09, 0x60, 0x80, 0x0C, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00},/*"@",32*/
        {0x00, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x00, 0x80, 0x13, 0x00, 0x78, 0x10, 0x80, 0x47, 0x00, 0x60, 0x40, 0x00, 0xE0, 0x41, 0x00, 0x00, 0x5F, 0x00, 0x00, 0xF0, 0x11, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10},/*"A",33*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0xC0, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00},/*"B",34*/
        {0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x60, 0x00, 0x08, 0xE0, 0x00, 0x0C, 0x80, 0x03, 0x03, 0x00, 0x00, 0x00},/*"C",35*/
        {0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x08, 0xC0, 0x01, 0x0E, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00},/*"D",36*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0xFC, 0x10, 0x60, 0x00, 0x10, 0x60, 0x00, 0x18, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00},/*"E",37*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00},/*"F",38*/
        {0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x40, 0x10, 0x20, 0x40, 0x10, 0x40, 0xC0, 0x0F, 0x80, 0xC3, 0x0F, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00},/*"G",39*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10},/*"H",40*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"I",41*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0xC0, 0xE0, 0xFF, 0x7F, 0xE0, 0xFF, 0x3F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},/*"J",42*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x30, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x3A, 0x00, 0xA0, 0xE1, 0x00, 0xE0, 0x80, 0x13, 0x60, 0x00, 0x1E, 0x20, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},/*"K",43*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00},/*"L",44*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0x0F, 0x10, 0x00, 0xFF, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x7C, 0x00, 0xC0, 0x03, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00},/*"M",45*/
        {0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0x01, 0x10, 0x80, 0x07, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x20, 0xC0, 0x03, 0x20, 0x00, 0x0F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00},/*"N",46*/
        {0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x0C, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00},/*"O",47*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x20, 0x10, 0x20, 0x20, 0x10, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x30, 0x00, 0x40, 0x10, 0x00, 0xC0, 0x1F, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00},/*"P",48*/
        {0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x19, 0x20, 0x00, 0x11, 0x20, 0x00, 0x17, 0x60, 0x00, 0x3C, 0xC0, 0x00, 0x6C, 0x80, 0xFF, 0x67, 0x00, 0xFE, 0x21, 0x00, 0x00, 0x00},/*"Q",49*/
        {0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x70, 0x00, 0x20, 0xD0, 0x01, 0x60, 0x08, 0x07, 0xC0, 0x0F, 0x1E, 0x80, 0x07, 0x18, 0x00, 0x00, 0x10},/*"R",50*/
        {0x00, 0x00, 0x00, 0x80, 0x07, 0x07, 0xC0, 0x0F, 0x0C, 0x60, 0x1C, 0x08, 0x20, 0x18, 0x10, 0x20, 0x38, 0x10, 0x20, 0x30, 0x10, 0x20, 0x70, 0x10, 0x40, 0xE0, 0x18, 0xE0, 0xE1, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00},/*"S",51*/
        {0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00},/*"T",52*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0xE0, 0xFF, 0x0F, 0x20, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0xE0, 0xFF, 0x07, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},/*"U",53*/
        {0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x20, 0x7E, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x80, 0x03, 0x00, 0x78, 0x00, 0xA0, 0x07, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},/*"V",54*/
        {0x20, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x20, 0xFF, 0x00, 0x00, 0xC0, 0x1F, 0x20, 0xC0, 0x03, 0x60, 0x3C, 0x00, 0xE0, 0x3F, 0x00, 0x20, 0xF0, 0x1F, 0x00, 0x80, 0x07, 0x20, 0x7C, 0x00, 0xE0, 0x03, 0x00, 0x20, 0x00, 0x00},/*"W",55*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xE0, 0x01, 0x16, 0x20, 0x87, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xE8, 0x00, 0x20, 0x86, 0x13, 0xE0, 0x01, 0x1E, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00},/*"X",56*/
        {0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x20, 0x0F, 0x10, 0x00, 0x3C, 0x10, 0x00, 0xF8, 0x1F, 0x00, 0xE0, 0x1F, 0x00, 0x18, 0x10, 0x20, 0x06, 0x10, 0xA0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00},/*"Y",57*/
        {0x00, 0x00, 0x00, 0x80, 0x01, 0x10, 0xE0, 0x00, 0x1C, 0x60, 0x00, 0x17, 0x20, 0x80, 0x11, 0x20, 0x60, 0x10, 0x20, 0x18, 0x10, 0x20, 0x06, 0x10, 0xA0, 0x03, 0x10, 0xE0, 0x00, 0x18, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00},/*"Z",58*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x7F, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"[",59*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00},/*"\",60*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0xFC, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"]",61*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"^",62*/
        {0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},/*"_",63*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"`",64*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x98, 0x1F, 0x00, 0x98, 0x19, 0x00, 0x84, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x08, 0x00, 0xFC, 0x0F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18},/*"a",65*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x0F, 0x00, 0x18, 0x08, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x18, 0x00, 0xF8, 0x0F, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00},/*"b",66*/
        {0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x18, 0x0C, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x38, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"c",67*/
        {0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x1C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x20, 0x04, 0x10, 0x20, 0x08, 0x08, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00},/*"d",68*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x88, 0x0C, 0x00, 0x84, 0x10, 0x00, 0x84, 0x10, 0x00, 0x84, 0x10, 0x00, 0x8C, 0x10, 0x00, 0xF8, 0x08, 0x00, 0xE0, 0x04, 0x00, 0x00, 0x00},/*"e",69*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x80, 0xFF, 0x1F, 0xC0, 0xFF, 0x1F, 0x60, 0x04, 0x10, 0x20, 0x04, 0x10, 0x20, 0x04, 0x10, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00},/*"f",70*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x7E, 0x00, 0xF8, 0xCF, 0x00, 0x8C, 0x85, 0x00, 0x04, 0x85, 0x00, 0x0C, 0x8D, 0x00, 0xFC, 0xCD, 0x00, 0xF4, 0x78, 0x00, 0x0C, 0x78, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00},/*"g",71*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},/*"h",72*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x60, 0xFC, 0x1F, 0x60, 0xFE, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"i",73*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x60, 0x04, 0xC0, 0x60, 0xFC, 0x7F, 0x60, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"j",74*/
        {0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x80, 0x10, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x1C, 0x13, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},/*"k",75*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"l",76*/
        {0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x10},/*"m",77*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},/*"n",78*/
        {0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF0, 0x0F, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x0C, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00},/*"o",79*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0xFC, 0xFF, 0x00, 0xFC, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1C, 0x00, 0xF8, 0x0F, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00},/*"p",80*/
        {0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x1C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0xF8, 0xFF, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00},/*"q",81*/
        {0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00},/*"r",82*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1E, 0x00, 0x78, 0x18, 0x00, 0xCC, 0x10, 0x00, 0xC4, 0x10, 0x00, 0x84, 0x11, 0x00, 0x84, 0x19, 0x00, 0x0C, 0x1F, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"s",83*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFF, 0x0F, 0xC0, 0xFF, 0x1F, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"t",84*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x08, 0x00, 0xFC, 0x1F, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00},/*"u",85*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0x03, 0x00, 0x74, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00},/*"v",86*/
        {0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x80, 0x1F, 0x00, 0x04, 0x0F, 0x00, 0xEC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x84, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0xE4, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00},/*"w",87*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1C, 0x00, 0x3C, 0x12, 0x00, 0xE4, 0x01, 0x00, 0xC0, 0x01, 0x00, 0x24, 0x13, 0x00, 0x1C, 0x1C, 0x00, 0x04, 0x18, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00},/*"x",88*/
        {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xC0, 0x00, 0x3C, 0x80, 0x00, 0xC4, 0x81, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0E, 0x00, 0xC4, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00},/*"y",89*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x13, 0x00, 0xC4, 0x11, 0x00, 0x74, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"z",90*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0xF8, 0xC7, 0x3F, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"{",91*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"|",92*/
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0xF8, 0xC7, 0x3F, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*"}",93*/
        {0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00},/*"~",94*/
};

/** endregion */


static uint8_t OLEDFont_getCharDotMatrix(uint8_t *dotMatrix, uint8_t fontSize, const uint8_t *font) {
    // Dot matrix bytes
    uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * (fontSize / 2);
    uint8_t chr = *font - ' ';
    switch (fontSize) {
        case 12:
            memcpy(dotMatrix, asc_1206[chr], fontByteSize);
            return 1;
        case 16 :
            memcpy(dotMatrix, asc_1608[chr], fontByteSize);
            return 1;
        case 24:
            memcpy(dotMatrix, asc_2412[chr], fontByteSize);
            return 1;
        default:
            return 0;
    }
}


